[Design pattern]: 设计模式相关系列
介绍
概念: 为其他对象提供一种代理以控制对这个对象的访问。
使用场景: 增加一个对象操作的访问控制,如根据权限判断用户是否能执行某个方法. 另一个应用是延迟加载,比如图片的对象,直到真正改变图片文件时才真正加载.
一个带访问控制的代理例子
CODE
真正的执行对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package note.com.proxy;
public class Action {
public void doOne(){ System.out.println("One"); } public void doTwo(){ System.out.println("Two"); } public void doThree(){ System.out.println("Three"); }
}
|
权限控制类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package note.com.proxy;
public class Permission {
private boolean one = false; private boolean two = false; private boolean three = false; public Permission(boolean one,boolean two,boolean three){ this.one = one; this.two = two; this.three = three; } public boolean isOne() { return one; } public void setOne(boolean one) { this.one = one; } public boolean isTwo() { return two; } public void setTwo(boolean two) { this.two = two; } public boolean isThree() { return three; } public void setThree(boolean three) { this.three = three; } }
|
对Action的代理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package note.com.proxy;
public class Proxy {
private Action action = null; private Permission permission = null; public Proxy(Permission permission){ this.action = new Action(); this.permission = permission; } public void doOne(){ if(permission.isOne()){ action.doOne(); } } public void doTwo(){ if(permission.isTwo()){ action.doTwo(); } } public void doThree(){ if(permission.isThree()){ action.doThree(); } } public Action getAction() { return action; } public void setAction(Action action) { this.action = action; } public Permission getPermission() { return permission; } public void setPermission(Permission permission) { this.permission = permission; } }
|
测试类
1 2 3 4 5 6 7 8 9 10 11
| package note.com.proxy;
public class ProxyTest { public static void main(String[] args) { Permission permission = new Permission(true,false,true); Proxy proxy = new Proxy(permission); proxy.doOne(); proxy.doTwo(); proxy.doThree(); } }
|
结果
真正的对象由代理对象去掉用,并且在代理对象中增加的访问控制